/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * HospedagemSelector.java
 *
 * Created on Apr 9, 2009, 11:15:21 AM
 */

package doghost.selectors;

import java.text.ParseException;
import javax.swing.RowFilter;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.TableRowSorter;
import org.jdesktop.application.Action;
import doghost.controllers.HospedagemController;
import doghost.entities.Hospedagem;
import doghost.reports.FaturamentoSelecionadoReport;
import doghost.utils.CustomUserDialog;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.persistence.Query;

/**
 *
 * @author duo
 */
public class HospedagemSelector extends javax.swing.JDialog {

    protected HospedagemController hospedagemController;
    protected Hospedagem selectedHospedagem;

    /** Creates new form HospedagemSelector */
    public HospedagemSelector(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();
        hospedagemController = new HospedagemController();
        hospedagemTable.getSelectionModel().addListSelectionListener(
                new ListSelectionListener() {


            @Override
                    public void valueChanged(ListSelectionEvent e) {
                        firePropertyChange("hospedagemRecordSelected",
                                !isHospedagemRecordSelected(), isHospedagemRecordSelected());
                    }
                });
    }

    public Hospedagem getSelectedHospedagem() {
        return selectedHospedagem;
    }

    public void setSelectedHospedagem(Hospedagem selectedHospedagem) {
        this.selectedHospedagem = selectedHospedagem;
    }

    public boolean isHospedagemRecordSelected() {
        return hospedagemTable.getSelectedRow() != -1;
    }

    @Action
    public void newHospedagem() {
        hospedagemController.newHospedagem(doghostPUEntityManager, hospedagemList);
    }

    @Action(enabledProperty = "hospedagemRecordSelected")
    public void editHospedagem() {
        boolean doEdit = false;
        int index = hospedagemTable.getSelectedRow();
        this.setSelectedHospedagem(hospedagemList.get(hospedagemTable.
                convertRowIndexToModel(index)));
        if(this.getSelectedHospedagem().getFaturamento() != null &&
                this.getSelectedHospedagem().getFaturamento().getTime() > 0L) {
            // hospedagem já faturada
            if (this.getSelectedHospedagem().getPagamento() != null &&
                this.getSelectedHospedagem().getPagamento().getTime() > 0L) {
                CustomUserDialog.avisar("Não se pode editar hospedagem já recebida, escolha faturar");
            } else {
                if(CustomUserDialog.perguntar("Não se pode editar hospedagem já faturada.\nDeseja " +
                        "desfazer o faturamento (RESPONDA COM ATENÇÃO !!!) ")) {
                    this.getSelectedHospedagem().setFaturamento((Date) null);
                    this.getSelectedHospedagem().setDiarias(new Integer(0));
                    this.getSelectedHospedagem().setValorDiaria(new Double("0.00"));
                    this.getSelectedHospedagem().setValor(new Double("0.00"));
                    try {
                        doghostPUEntityManager.getTransaction().begin();
                        doghostPUEntityManager.merge(this.getSelectedHospedagem());
                        doghostPUEntityManager.getTransaction().commit();
                    } catch (Exception e) {
                        CustomUserDialog.avisar("Falha ao tentar reverter o faturamento.\n" + e);
                    }
                    doEdit = true;
                }
            }
        } else {
            doEdit = true;
        }
        if(doEdit) {
            hospedagemController.setHospedagem(this.getSelectedHospedagem());
            hospedagemController.editHospedagem(doghostPUEntityManager, hospedagemList,
                    hospedagemTable.convertRowIndexToModel(index));
        }
    }

    @Action(enabledProperty = "hospedagemRecordSelected")
    public void deleteHospedagem() {
        int index = hospedagemTable.getSelectedRow();
        hospedagemController.setHospedagem(hospedagemList.get(hospedagemTable.
            convertRowIndexToModel(index)));
        hospedagemController.deleteHospedagem(doghostPUEntityManager, hospedagemList,
            hospedagemTable.convertRowIndexToModel(index));
    }

    @Action
    public void cancelHospedagemSelector() {
        setSelectedHospedagem(null);
        setVisible(false);
    }

    @Action(enabledProperty = "hospedagemRecordSelected")
    public void selectHospedagem() {
        int index = hospedagemTable.getSelectedRow();
        setSelectedHospedagem(hospedagemList.get(hospedagemTable.
                convertRowIndexToModel(index)));
        setVisible(false);
    }

    @Action
    public void filterHospedagem() {
        TableRowSorter hospedagemSorter = (TableRowSorter) hospedagemTable.getRowSorter();
        String text = hospedagemFilterTextField.getText();
        hospedagemFilterTextField.setText("");
        if(text.length()==0) {
            hospedagemSorter.setRowFilter(null);
        } else {
            hospedagemSorter.setRowFilter(RowFilter.regexFilter("(?u)(?i)" + text));
        }
    }

    @Action(enabledProperty = "hospedagemRecordSelected")
    public void faturarHospedagem() {
        int index = hospedagemTable.getSelectedRow();
        this.setSelectedHospedagem(hospedagemList.get(hospedagemTable.
                convertRowIndexToModel(index)));
        if(this.getSelectedHospedagem().getFim() == null ||
                this.getSelectedHospedagem().getFim().getTime() == 0L) {
            // hospedagem não faturada
            CustomUserDialog.avisar("Não se pode faturar hospedagem em aberto, escolha editar e informe a data do fim da hospedagem");
        } else {
            hospedagemController.setHospedagem(this.getSelectedHospedagem());
            hospedagemController.faturarHospedagem(doghostPUEntityManager, hospedagemList,
                    hospedagemTable.convertRowIndexToModel(index));
        }
    }

    @Action(enabledProperty = "hospedagemRecordSelected")
    public void EmitirFaturaHospedagem() throws ParseException {
        int index = hospedagemTable.getSelectedRow();
        this.setSelectedHospedagem(hospedagemList.get(hospedagemTable.
                convertRowIndexToModel(index)));
        if(this.getSelectedHospedagem().getFim() == null ||
                this.getSelectedHospedagem().getFim().getTime() == 0L) {
            // hospedagem não faturada
            CustomUserDialog.avisar("Não se pode faturar hospedagem em aberto, escolha editar e informe a data do fim da hospedagem");
        } else {
            new FaturamentoSelecionadoReport(this.getSelectedHospedagem().getId());
        }
    }

    @Action(enabledProperty = "hospedagemRecordSelected")
    public void baixarHospedagem() {
        int index = hospedagemTable.getSelectedRow();
        this.setSelectedHospedagem(hospedagemList.get(hospedagemTable.
                convertRowIndexToModel(index)));
        if(this.getSelectedHospedagem().getFaturamento() == null ||
                this.getSelectedHospedagem().getFaturamento().getTime() == 0L) {
            // hospedagem não faturada
            CustomUserDialog.avisar("Não se pode baixar hospedagem não faturada, realize a ação faturar antes.");
        } else {
            String msg = "Confirma recebimento desta hospedagem na data " +
                    new SimpleDateFormat("dd/MM/yyyy").format(new Date());
            if (CustomUserDialog.perguntar(msg)) {
                hospedagemController.setHospedagem(this.getSelectedHospedagem());
                hospedagemController.receberHospedagem(doghostPUEntityManager, hospedagemList,
                        hospedagemTable.convertRowIndexToModel(index));
            }
        }
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {
        bindingGroup = new org.jdesktop.beansbinding.BindingGroup();

        doghostPUEntityManager = java.beans.Beans.isDesignTime() ? null : javax.persistence.Persistence.createEntityManagerFactory("doghostPU").createEntityManager();
        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(doghost.DoghostApp.class).getContext().getResourceMap(HospedagemSelector.class);
        hospedagemQuery = java.beans.Beans.isDesignTime() ? null : doghostPUEntityManager.createQuery(resourceMap.getString("hospedagemQuery.query")); // NOI18N
        hospedagemList = java.beans.Beans.isDesignTime() ? java.util.Collections.emptyList() : org.jdesktop.observablecollections.ObservableCollections.observableList(hospedagemQuery.getResultList());
        customTimestampRenderer1 = new doghost.utils.CustomTimestampRenderer();
        customDateRenderer1 = new doghost.utils.CustomDateRenderer();
        hospedagemFilterTextField = new javax.swing.JTextField();
        hospedagemFilterButton = new javax.swing.JButton();
        hospedagemSelectionPanel = new org.jdesktop.swingx.JXPanel();
        hospedagemScrollPane = new javax.swing.JScrollPane();
        hospedagemTable = new javax.swing.JTable();
        newButton = new javax.swing.JButton();
        editButton = new javax.swing.JButton();
        deleteButton = new javax.swing.JButton();
        cancelButton = new javax.swing.JButton();
        selectButton = new javax.swing.JButton();
        faturamentoButton = new javax.swing.JButton();
        baixarButton = new javax.swing.JButton();

        customTimestampRenderer1.setName("customTimestampRenderer1"); // NOI18N

        customDateRenderer1.setName("customDateRenderer1"); // NOI18N

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle(resourceMap.getString("Form.title")); // NOI18N
        setName("Form"); // NOI18N

        hospedagemFilterTextField.setName("hospedagemFilterTextField"); // NOI18N

        javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(doghost.DoghostApp.class).getContext().getActionMap(HospedagemSelector.class, this);
        hospedagemFilterButton.setAction(actionMap.get("filterHospedagem")); // NOI18N
        hospedagemFilterButton.setName("hospedagemFilterButton"); // NOI18N

        hospedagemSelectionPanel.setName("hospedagemSelectionPanel"); // NOI18N

        hospedagemScrollPane.setName("hospedagemScrollPane"); // NOI18N

        hospedagemTable.setAutoCreateRowSorter(true);
        hospedagemTable.setName("hospedagemTable"); // NOI18N

        org.jdesktop.swingbinding.JTableBinding jTableBinding = org.jdesktop.swingbinding.SwingBindings.createJTableBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, hospedagemList, hospedagemTable);
        org.jdesktop.swingbinding.JTableBinding.ColumnBinding columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${inicio}"));
        columnBinding.setColumnName("Inicio");
        columnBinding.setColumnClass(java.util.Date.class);
        columnBinding.setEditable(false);
        columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${fim}"));
        columnBinding.setColumnName("Fim");
        columnBinding.setColumnClass(java.util.Date.class);
        columnBinding.setEditable(false);
        columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${animal.nome}"));
        columnBinding.setColumnName("Animal.nome");
        columnBinding.setColumnClass(String.class);
        columnBinding.setEditable(false);
        columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${faturamento}"));
        columnBinding.setColumnName("Faturamento");
        columnBinding.setColumnClass(java.util.Date.class);
        columnBinding.setEditable(false);
        columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${pagamento}"));
        columnBinding.setColumnName("Pagamento");
        columnBinding.setColumnClass(java.util.Date.class);
        columnBinding.setEditable(false);
        bindingGroup.addBinding(jTableBinding);
        jTableBinding.bind();
        hospedagemScrollPane.setViewportView(hospedagemTable);
        hospedagemTable.getColumnModel().getColumn(0).setHeaderValue(resourceMap.getString("hospedagemTable.columnModel.title0")); // NOI18N
        hospedagemTable.getColumnModel().getColumn(0).setCellRenderer(customTimestampRenderer1);
        hospedagemTable.getColumnModel().getColumn(1).setHeaderValue(resourceMap.getString("hospedagemTable.columnModel.title1")); // NOI18N
        hospedagemTable.getColumnModel().getColumn(1).setCellRenderer(customTimestampRenderer1);
        hospedagemTable.getColumnModel().getColumn(2).setHeaderValue(resourceMap.getString("hospedagemTable.columnModel.title2")); // NOI18N
        hospedagemTable.getColumnModel().getColumn(3).setHeaderValue(resourceMap.getString("hospedagemTable.columnModel.title3")); // NOI18N
        hospedagemTable.getColumnModel().getColumn(3).setCellRenderer(customDateRenderer1);
        hospedagemTable.getColumnModel().getColumn(4).setHeaderValue(resourceMap.getString("hospedagemTable.columnModel.title4")); // NOI18N
        hospedagemTable.getColumnModel().getColumn(4).setCellRenderer(customDateRenderer1);

        javax.swing.GroupLayout hospedagemSelectionPanelLayout = new javax.swing.GroupLayout(hospedagemSelectionPanel);
        hospedagemSelectionPanel.setLayout(hospedagemSelectionPanelLayout);
        hospedagemSelectionPanelLayout.setHorizontalGroup(
            hospedagemSelectionPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 760, Short.MAX_VALUE)
            .addGroup(hospedagemSelectionPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(hospedagemSelectionPanelLayout.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(hospedagemScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 736, Short.MAX_VALUE)
                    .addContainerGap()))
        );
        hospedagemSelectionPanelLayout.setVerticalGroup(
            hospedagemSelectionPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 338, Short.MAX_VALUE)
            .addGroup(hospedagemSelectionPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(hospedagemSelectionPanelLayout.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(hospedagemScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 314, Short.MAX_VALUE)
                    .addContainerGap()))
        );

        newButton.setAction(actionMap.get("newHospedagem")); // NOI18N
        newButton.setName("newButton"); // NOI18N

        editButton.setAction(actionMap.get("editHospedagem")); // NOI18N
        editButton.setName("editButton"); // NOI18N

        deleteButton.setAction(actionMap.get("deleteHospedagem")); // NOI18N
        deleteButton.setName("deleteButton"); // NOI18N

        cancelButton.setAction(actionMap.get("cancelHospedagemSelector")); // NOI18N
        cancelButton.setName("cancelButton"); // NOI18N

        selectButton.setAction(actionMap.get("EmitirFaturaHospedagem")); // NOI18N
        selectButton.setName("selectButton"); // NOI18N

        faturamentoButton.setAction(actionMap.get("faturarHospedagem")); // NOI18N
        faturamentoButton.setText(resourceMap.getString("faturamentoButton.text")); // NOI18N
        faturamentoButton.setName("faturamentoButton"); // NOI18N

        baixarButton.setAction(actionMap.get("baixarHospedagem")); // NOI18N
        baixarButton.setText(resourceMap.getString("baixarButton.text")); // NOI18N
        baixarButton.setName("baixarButton"); // NOI18N

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(hospedagemSelectionPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(hospedagemFilterTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 151, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(18, 18, 18)
                        .addComponent(hospedagemFilterButton))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(newButton)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(editButton)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(deleteButton)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(cancelButton)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 308, Short.MAX_VALUE)
                        .addComponent(faturamentoButton)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(selectButton)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(baixarButton)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(hospedagemFilterTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(hospedagemFilterButton))
                .addGap(18, 18, 18)
                .addComponent(hospedagemSelectionPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(newButton)
                        .addComponent(editButton)
                        .addComponent(deleteButton)
                        .addComponent(cancelButton))
                    .addComponent(baixarButton)
                    .addComponent(selectButton)
                    .addComponent(faturamentoButton))
                .addContainerGap())
        );

        bindingGroup.bind();

        pack();
    }// </editor-fold>//GEN-END:initComponents

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                HospedagemSelector dialog = new HospedagemSelector(new javax.swing.JFrame(), true);
                dialog.addWindowListener(new java.awt.event.WindowAdapter() {
                    public void windowClosing(java.awt.event.WindowEvent e) {
                        System.exit(0);
                    }
                });
                dialog.setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton baixarButton;
    private javax.swing.JButton cancelButton;
    private doghost.utils.CustomDateRenderer customDateRenderer1;
    private doghost.utils.CustomTimestampRenderer customTimestampRenderer1;
    private javax.swing.JButton deleteButton;
    private javax.persistence.EntityManager doghostPUEntityManager;
    private javax.swing.JButton editButton;
    private javax.swing.JButton faturamentoButton;
    private javax.swing.JButton hospedagemFilterButton;
    private javax.swing.JTextField hospedagemFilterTextField;
    private java.util.List<doghost.entities.Hospedagem> hospedagemList;
    private javax.persistence.Query hospedagemQuery;
    private javax.swing.JScrollPane hospedagemScrollPane;
    private org.jdesktop.swingx.JXPanel hospedagemSelectionPanel;
    private javax.swing.JTable hospedagemTable;
    private javax.swing.JButton newButton;
    private javax.swing.JButton selectButton;
    private org.jdesktop.beansbinding.BindingGroup bindingGroup;
    // End of variables declaration//GEN-END:variables

}
